package Shifu.Login;

import java.sql.*;
import java.util.*;
import java.io.Serializable;

/**
 * Classe statica per l'interazione con il DB
 * Permette di aggiungere, rimuovere e modificare la tabella dei peer nel
 * database.
 */

public class DBInteraction implements Serializable {

	private String urldb = "jdbc:postgresql://127.0.0.1:5432/Shifu";	//url per db
 
 	private String username = "prova"; //username accesso db

	private String password = "prova"; //password accesso db

	private Connection conn = null; // connessione al db

	private PreparedStatement pstm = null; // prepareStatement per le query

	private String sql;

	public DBInteraction() {

	}

	/**
	 * Carica i driver per database
	 * Crea la connessione al database e il PrepareStatement
	 * @param sqlquery la query da eseguire
	 */

	public void createConnection(String sqlquery) throws SQLException {
		

		//Caricamento driver per DB
		try {

			Class.forName("org.postgresql.Driver");
		}

		catch (ClassNotFoundException cnfe) {

     			 System.out.println("Driver jdbc non trovato: " + cnfe.getMessage());
			 cnfe.printStackTrace();
		}

		try {

                       conn = DriverManager.getConnection(urldb,username,password); 
		       pstm = conn.prepareStatement(sqlquery);
		   
		} catch (Exception e) {
		 
  			System.out.println("Errore nella creazione della connesione al database " + e.getMessage());
		}
		

	}

	/**
         * Controlla se il login di un Seeder è valido
	 * @param username username dell utente
	 * @param password password dell utente
	 * @return true se ha buon esito false altrimenti
	 */
	
	public boolean checkSeeder(String username,String password) throws SQLException {

		createConnection("SELECT * FROM Peer WHERE username=? AND password=? AND seeder=true");		
		pstm.clearParameters();
		pstm.setString(1,username);
		pstm.setString(2,password);	
		ResultSet rs = pstm.executeQuery();
		conn.close();
		return (rs.next()); 
	}

	/**
         * Controlla se il login di un Leecher è valido
	 * @param username username dell utente
	 * @param password password dell utente
	 * @return true se ha buon esito false altrimenti
	 */

	public boolean checkLeecher(String username,String password) throws SQLException {
	
		createConnection("SELECT * FROM Peer WHERE username=? AND password=?");		
		pstm.clearParameters();
		pstm.setString(1,username);
		pstm.setString(2,password);	
		ResultSet rs = pstm.executeQuery();
		conn.close();
		return (rs.next());
	}

	/**
         * Aggiunge un Leecher alla tabella dei Peer
	 * @param username username dell utente
	 * @param password password dell utente
	 * @return true se ha buon esito false altrimenti
	 */	

	public boolean addPeer(String username,String password) throws SQLException {

		//Controlla che l'username non sia gia presente
		createConnection("SELECT * FROM Peer WHERE username=?");
		pstm.clearParameters();
		pstm.setString(1,username);
		ResultSet rs = pstm.executeQuery();
		if(rs.next()) {
			System.out.println("Username gia presente !");
			return false;
		}
		conn.close();

		//Aggiunge il nuovo username
		createConnection("INSERT INTO Peer VALUES (?,?,false)");
		pstm.clearParameters();
		pstm.setString(1,username);
		pstm.setString(2,password);
		int succes = (pstm.executeUpdate());
		conn.close();
		if (succes == 0) return false;
		return true;	
	}		

	/**
         * Rimuove un Peer dalla tabella dei Peer
	 * @param username username dell utente
	 * @param password password dell utente
	 * @return true se ha buon esito false altrimenti 
	 */	

	public boolean removePeer(String username,String password) throws SQLException {

			
		//Rimuove un peer dal database
		createConnection("DELETE FROM Peer WHERE username=? AND password=?");
		pstm.clearParameters();
		pstm.setString(1,username);
		pstm.setString(2,password);
		int succes = (pstm.executeUpdate());
		conn.close();
		if (succes == 0) return false;
		return true;	
	}

	/**
         * Promuove un peer da Leecher a Seeder
	 * @param username username dell utente
	 * @return true se ha buon esito false altrimenti
	 */

	public boolean promovePeer(String username) throws SQLException {

		//Rimuove un peer dal database
		createConnection("UPDATE Peer SET seeder = 'true' WHERE username=?");
		pstm.clearParameters();
		pstm.setString(1,username);
		int succes = (pstm.executeUpdate());
		conn.close();
		if (succes == 0) return false;
		return true;
	}

	/**
	 * Controlla se il peer è un Seeder
	 * @param username username dell utente
	 * @return true se ha buon esito false altrimenti
	 */ 			
	
	public boolean isSeeder(String username) throws SQLException {
		
		//Controlla se un peer è gia Seeder
		createConnection("SELECT * FROM Peer WHERE username=? AND seeder = 'true'");
		pstm.clearParameters();
		pstm.setString(1,username);
		ResultSet rs = pstm.executeQuery();
		conn.close();
		return (rs.next());
	}

	/**
         * Recupera l'elenco di tutti i Peer nella tabella
	 * @return lista dei peer registrati
	 */

	public ArrayList getAllPeer() throws SQLException {

		createConnection("SELECT username FROM Peer");
		ResultSet rs = pstm.executeQuery();
		ArrayList list = new ArrayList();
		//Mette tutto il resultset in una arraylist
		while(rs.next()) {
			list.add(rs.getString("username"));
		}
		return list;
	}

}
